<?php
class Questions extends Controller {
	
	var $name = 'questions';
	
	/**
	 * 
	 * Monta a tela de visualização das questões da unidade
	 */
	public function index_action() {

		//Pega id da unidade
		$id_unit = $this->getParam('unit');	
		
		try {
			//Faz a consulta no banco de dados e recupera a unidade
			$unit = $this->DB->get_records('oaeditor_units', array('id'=>$id_unit));
			
			if(empty($unit)) {
				throw new Exception("Erro ao tentar recuperar a unidade do banco de dados.");				
			}
		}catch(Exception $ex) {
			$this->setErro($ex->getMessage());
			header('Location: '.WWW_APP.'units/');
		}	
		
		//Recupera as questões da unidade
		$data['questions_list'] = $this->getQuestions($id_unit);
		//id da unidade
		$data['unitid'] = $id_unit;
		//Nome da unidade
		$data['unit'] = $unit[$id_unit]->name;	
		
		$this->bar_title = $unit[$id_unit]->name.' : Questões';
		
		$this->view('index', $data);
				
	}
	
	/**
	 * 
	 * Adiciona uma pergunta ao banco de dados
	 */
	public function add() {
		
		//Pega id da unidade
		$id_unit = $this->getParam('unit');
		
		try {
			//Faz a consulta no banco de dados e recupera a unidade
			$unit = $this->DB->get_records('oaeditor_units', array('id'=>$id_unit));
			
			if(empty($unit)) {
				throw new Exception("Erro ao tentar recuperar a unidade do banco de dados.");				
			}
		}catch(Exception $ex) {			
			$this->setErro($ex->getMessage());
			header('Location: '.WWW_APP.'units/');
		}	
		$data['unit'] = $unit[$id_unit]->name;	
		$data['unitid'] = $id_unit;	
				
		//Se for dado submit
		if($_POST) {
			
			$controle = true;
			//verifica se todos os campos estão preenchidos
			foreach($_POST as $value) {
				if($value == '' || $value == null) {
					$controle = false;
					break;
				}
			}
			
			if($controle) {
				//Monta o registro pra salvar no banco de dados
				$record = new stdClass();
				$record->unitid = $id_unit;
				foreach($_POST as $key=>$value) {
					$record->$key = $value;
				}				
				$record->date = date('Y-m-d H:m:s');
				
				try {
					//Salva a pergunta no banco de dados
    				$this->DB->insert_record('oaeditor_questions', $record, false);
    				$this->setMens('Questão salva com sucesso.');
    				header('Location: '.WWW_APP.'questions/index/unit/'.$id_unit);
				}catch(Exception $ex) {
    				$this->setErro('Erro ao tentar salvar a questão no banco de dados. '.$ex);
    				header('Location: '.WWW_APP.'units/');
    			}				
			}else {
				$this->setErro("Campos obrigatórios não preenchidos.");
			}
		}		
		
		//Recupera as questões da unidade
		$data['questions_list'] = $this->getQuestions($id_unit);
		//Recupera conceitos da unidade.
		$data['concepts'] = $this->getConcepts($unit[$id_unit]->name);
		
		$this->bar_title = $unit[$id_unit]->name.' : Nova Questão';
				
		//Envia dados para a view
		$this->view('add', $data);
	}
	
	/**
	 * 
	 * Monta a página de visualização de um questionário
	 */
	public function visualize() {
		
		//Pega o id da unidade
		$unitid = $this->getParam('unit');
		//Pega id da questão
		$questionid = $this->getParam('question');		
		
		try {
			//Faz a consulta no banco de dados e recupera a questão
			$question = $this->DB->get_record('oaeditor_questions', array('id'=>$questionid));
			//Faz a consulta no banco de dados e recupera a unidade
			$unit = $this->DB->get_records('oaeditor_units', array('id'=>$unitid));
			
			if(empty($question) || empty($unit)) {
				throw new Exception("Erro ao tentar fazer a busca no banco de dados.");				
			}
		}catch(Exception $ex) {
			$this->setErro($ex->getMessage());
			header('Location: '.WWW_APP.'units/');
		}		
		
		$data['question'] = $question;		
		$data['questions_list'] = $this->getQuestions($unitid);
		$data['unit'] = $unit[$unitid]->name;	
		$data['concepts'] = $this->getConcepts($unit[$unitid]->name);
		
		$this->bar_title = $unit[$unitid]->name.' : Visualizar/Editar Questão';
		
		$this->view('visualize', $data);
	}
	
	/**
	 * 
	 * Edita uma questão do banco de dados
	 */
	public function edit() {
		
		//Pega id da questão
		$questionid = $this->getParam('question');
		
		try {
			//Recupera a questão do banco de dados
			$question = $this->DB->get_record('oaeditor_questions', array('id'=>$questionid));
			
			if(empty($question)) {
				throw new Exception("Erro ao tentar fazer a busca no banco de dados.");				
			}
		}catch(Exception $ex) {
			$this->setErro($ex->getMessage()); 
			header('Location: '.WWW_APP.'units/');					
		}
		
		//Se tiver dados do post
		if($_POST) {
			
			$controle = true;
			//verifica se todos os campos estão preenchidos
			foreach($_POST as $key=>$value) {
				if($value == '' || $value == null) {
					$controle = false;
					break;
				}else {
					$post[$key] = trim($value);
				}
			}
			
			if($controle) {
				//Monta um array com o objeto recuperado do banco de dados
				foreach($question as $key=>$q) {
					$question_array[$key] = trim($q);
				}	
			
				//Varifica se existe diferença entre os dados que está no banco de dados
				//e os dados que vieram do post
				$diff = array_diff($post, $question_array);
				
				if(!empty($diff)) {
					//Monta o registro com os campos que foram alterados
					$record->id = $questionid;
					foreach($diff as $k=>$value) {
						$record->$k = $value;
					}

					try {
						//Salva os registros modificados no banco de dados									
						$update = $this->DB->update_record("oaeditor_questions", $record);
						$this->setMens('Questão alterada com sucesso.');
						header('Location: '.WWW_APP.'questions/index/unit/'.$question->unitid);
					}catch(Exception $ex) {
						$this->setErro('Não foi possível alterar a questão. '.$ex);    	
    					header('Location: '.WWW_APP.'questions/index/unit/'.$question->unitid);
					}
				}else {
					header('Location: '.WWW_APP.'questions/index/unit/'.$question->unitid);
				}				
			}else {
				$this->setErro('Campos obrigatórios não preenchidos.');
				header('Location: '.WWW_APP.'questions/visualize/unit/'.$question->unitid.'/question/'.$question->id);				
			}
		}
	}
	
	/**
	 * 
	 * Remove uma questão do banco de dados
	 */
	public function delete() {
		
		//Pega id da questão
		$questionid = $this->getParam('question');
		//Pega o id da unidade
		$unitid = $this->getParam('unit');
		//Remove a questão do banco de dados				
		$this->DB->delete_records('oaeditor_questions', array('id'=>$questionid));
		//Faz uma consulta pra saber se o registro ainda se encontra no banco de dados
		$question = $this->DB->get_record('oaeditor_questions', array('id'=>$questionid));
		
		//Se questão não está no banco então foi removida com sucesso
		if(!$question) {
			$this->setMens("Questão excluída com sucesso.");
			header('Location: '.WWW_APP.'questions/index/unit/'.$unitid);
		}else {
			$this->setErro("Erro ao tentar excluir a questão do banco de dados.");
			header('Location: '.WWW_APP.'units/');
		}
				
	}
	
	/**
	 * 
	 * Retorna um array com a lista de questões da unidade
	 * @param Integer $unitid  id da unidade
	 */
	private function getQuestions($unitid) {
		
		try {
			//Faz uma consulta no banco de dados e recupera todas as questões da unidade
			$questions = $this->DB->get_records('oaeditor_questions', array('unitid'=>$unitid));			
		}catch(Exception $ex) {			
			$this->setErro($ex->getMessage());
			header('Location: '.WWW_APP.'units/');
		}
		
		//Monta um array com as questões da unidade
		foreach($questions as $question) {
			$questions_list[$question->id] = $question; 
		}
	
		return $questions_list;
	}
	
	/**
	 * 
	 * Método que retorna um array de conceitos da unidade passada como parâmetro
	 * @param String $name_unit   nome da unidade
	 */
	private function getConcepts($name_unit) {
		
		//Lê o xml da unidade
		$xml = simplexml_load_file(FILES.$name_unit.DS."graph.xml");
		
		if(!$xml) {
			$this->setErro("Erro ao tentar ler o arquivo xml.");
			header('Location: '.WWW_APP.'units/');
		}
		//Nó inicial
		$nodes[0] = "Introdução";
		//Monta o array de conceitos
		foreach($xml->node as $node) {
    		$nodes[(String)$node['id']] = (String)$node['name'];			
    	}
    	
    	//retorna o array de conceitos
   		return $nodes;
		
	}
}